#include "HttpServer.hpp"
#include "Damen.hpp"

using namespace LogModule;
#include <string>
#include <sstream>
#include <iomanip>

std::string UrlEncode(const std::string& str) {
    std::ostringstream escaped;
    escaped.fill('0');
    escaped << std::hex;

    for (unsigned char c : str) {
        // 保留字母、数字和一些安全符号
        if (std::isalnum(c) || c == '-' || c == '_' || c == '.' || c == '~') {
            escaped << c;
        } else {
            // 其他字符转为 %XX 形式
            escaped << '%' << std::uppercase << std::setw(2) << int(c);
        }
    }

    return escaped.str();
}

void Login(HttpRequest &req, HttpResponse &resp)
{
    // req.Path(): /login
    // 根据req，动态构建username=lisi&password=abcdefg
    LOG(LogLevel::DEBUG) << "进入登录模块" << req.Path() << ", " << req.Args();
  //  std::string req_args = req.Args();
    // 1. 解析参数格式，得到要的参数

    // 2. 访问数据库，验证对应的用户是否是合法的用户，其他工作....
    // TODO
    // SessionManager m;
    // session_id = m.CreateSession(XXXXX);

    // 3. 登录成功
    // std::string body = req.GetContent("wwwroot/success.html");
    // resp.SetCode(200);
    // resp.SetHeader("Content-Length", std::to_string(body.size()));
    // resp.SetHeader("Content-Type", "text/html");
    // resp.SetHeader("Set-Cookie", "usename=zhangsan&passwd=11111111");
    // resp.SetBody(body);
   resp.SetCode(302);
   resp.SetHeader("Location", "/");
    // 1. 解析参数，比如获取 username
     // 注意 URL 编码！

   
}

void Love(HttpRequest &req, HttpResponse &resp)
{
    // LOG(LogLevel::DEBUG) << "进入Love模块";
    // std::string username = req.Args(); // 假设你有 GetArg 方法解析 query 或 body
    // if (username.empty()) {
    //     resp.SetCode(400);
    //     resp.SetBody("Missing username");
    //     return;
    // }

    // // 2. 验证用户（省略数据库验证逻辑）
    // // TODO: verify user...

    // // 3. 登录成功，重定向并携带名字
    // std::string redirect_url = "/love?" + UrlEncode(username);
    // resp.SetCode(302);
    // resp.SetHeader("Location", redirect_url);
    if (req.Path() == "/love") {
    // 手动读取 love.html 文件内容并返回
    std::string body = req.GetContent("wwwroot/love.html"); // 假设你有这个函数
    if (!body.empty()) {
        resp.SetHeader("Content-Type", "text/html; charset=utf-8");
        resp.SetBody(body);
    } else {
        resp.SetCode(404);
        resp.SetBody("Page not found");
    }
    return;
}
}

int main(int argc, char *argv[])
{
    if(argc != 2)
    {
        std::cout << "Usage: " << argv[0] << " port" << std::endl;
        return 1;
    }
    Daemon(false,false);
    auto httpserver = std::make_unique<HttpServer>(std::stoi(argv[1]));
    // 要让服务器具有登录功能
    httpserver->Resgiter("/login", Login); // restful风格的网络请求接口
    httpserver->Resgiter("/love", Love);
    httpserver->Start();
    return 0;
}